package postgres

import (
	"context"
	"errors"
	"quipus/internal/database/model"

	apb "quipus/proto/gen/assist"

	_ "github.com/jackc/pgx/v5/stdlib"
	_ "github.com/joho/godotenv/autoload"
)

func (p *PGDB) CreateTenant(ctx context.Context, create *model.Tenant) error {
	p.query()
	qdo := q.WithContext(ctx)
	err := qdo.Tenant.Create(create)

	if err != nil {
		return err
	}

	return nil
}

func (p *PGDB) ListTenants(ctx context.Context, find *apb.FindTenant) ([]*model.Tenant, int64, error) {
	p.query()
	qdo := q.WithContext(ctx)
	tenant := qdo.Tenant
	if find.Id > 0 {
		tenant = tenant.Where(q.Tenant.ID.Eq(find.Id))
	}

	if find.RowStatus > 0 {
		tenant = tenant.Where(q.Tenant.RowStatus.Eq(find.RowStatus.String()))
	}
	if len(find.TenantName) > 0 {
		tenant = tenant.Where(q.Tenant.TenantName.Eq(find.TenantName))
	}

	if find.Id > 0 {
		tenant = tenant.Where(q.Tenant.ID.Eq(find.Id))
	}

	limit := find.Limit
	if limit == 0 {
		limit = 10
	}

	return tenant.FindByPage(int(find.Offset), int(limit))
}

func (p *PGDB) UpdateTenant(ctx context.Context, update *apb.UpdateTenant) (*model.Tenant, error) {
	p.query()
	qdo := q.WithContext(ctx)
	if update.Id < 0 {
		return nil, errors.New("id is required")
	}

	tenant := qdo.Tenant
	tenant = tenant.Where(q.Tenant.ID.Eq(update.Id))

	updateValue := &model.Tenant{}
	updateValue.ID = update.Id
	if update.UpdatedTs > 0 {
		updateValue.UpdatedTs = update.UpdatedTs
	}

	if update.RowStatus > 0 {
		updateValue.RowStatus = update.RowStatus.String()
	}

	if update.TenantName != "" {
		updateValue.TenantName = update.TenantName
	}

	if len(update.Email) > 0 {
		updateValue.Email = update.Email
	}

	if len(update.ShowName) > 0 {
		updateValue.ShowName = update.ShowName
	}

	if len(update.Avatar) > 0 {
		updateValue.AvatarURL = update.Avatar
	}

	if len(update.Description) > 0 {
		updateValue.Description = update.Description
	}

	_, e := tenant.Updates(updateValue)

	return updateValue, e
}

func (p *PGDB) DeleteTenant(ctx context.Context, delete *apb.DeleteTenant) error {
	p.query()
	qdo := q.WithContext(ctx)
	_, err := qdo.Tenant.Where(q.Tenant.ID.Eq(delete.Id)).Delete()

	if err != nil {
		return err
	}

	return nil
}

func (p *PGDB) GetTenant(ctx context.Context, find *apb.FindTenant) (*model.Tenant, error) {
	p.query()
	qdo := q.WithContext(ctx)
	tenant := qdo.Tenant
	if find.Id >= 0 {
		tenant = tenant.Where(q.Tenant.ID.Eq(find.Id))
	}

	if find.TenantName != "" {
		tenant = tenant.Where(q.Tenant.TenantName.Eq(find.TenantName))
	}
	return tenant.First()
}
